%macro releff(data,npop,y,x) ; proc corr data = &data outp = corrout noprint ; var &y &x ; run ; data corrout ; set corrout ; if _type_ = "CORR" and _name_ = "&y" ; rhohat = &x ; match = 'Y' ; keep rhohat match ; *proc print data = corrout ; run ; proc univariate data = &data noprint ; var &y &x ; output out = univout mean = mn&y mn&x std = s&y s&x cv = cv&y cv&x n = nobs ; run ; data univout ; set univout ; match = 'Y' ; *proc print data = univout ; run ; data both ; merge univout corrout ; by match ; r = mn&y/mn&x ; popn = &npop ; relbias_ratio = (cv&x**2 -rhohat*cv&y*cv&x)*(popn-nobs)/(10000*popn*nobs) ; * divide by 10000 because SAS defines cv as 100(s/xbar) ; re_regr_ybar = 1/(1-rhohat**2) ; re_regr_ratio = (s&y**2 +(r*s&x)**2 -2*r*rhohat*s&y*s&x)/ (s&y**2*(1-rhohat**2)) ; re_regr_diff = (s&y**2 +s&x**2 -2*rhohat*s&y*s&x)/ (s&y**2*(1-rhohat**2)) ; proc print data = both ; run ; %mend releff ;